package mb.admin.webbean;

import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.faces.model.SelectItem;

import mb.admin.dao.StatisticsDAO;
import mb.commons.CalendarManager;
import mb.kurier.data.StatisticsData;

import org.apache.myfaces.trinidad.model.ChartModel;

/**
 * Manager widoku statystyk administratora
 * @author Michał Budziło
 *
 */
public class StatisticsManager extends ChartModel {

	private CalendarManager calendar;

	private ArrayList<SelectItem> typy;
	private ArrayList<SelectItem> typWykresu;
	private ArrayList<SelectItem> listaKurierow;
	private ArrayList<SelectItem> listaOdzialow;

	private String selectedTyp;
	private String selectedTypWykresu;
	private List<String> selectedKurier;
	private List<String> selectedOddzial;

	private StatisticsDAO dao;
	private ArrayList<StatisticsData> list;
	private Date dataOd;
	private Date dataDo;
	private Integer type;
	private List<String> labelX;
	private Integer seriesNumber;
	private boolean perspektywa;
	private boolean disabledKurier;
	private boolean disabledOddzialy;
	private String tytul;
	
	private ArrayList<StatisticsData> dataList1;

	/**
	 * Konstruktor
	 */
	public StatisticsManager() {
		super();
		dao = new StatisticsDAO();
		calendar = new CalendarManager();
		typy = new ArrayList<SelectItem>();
		typWykresu = new ArrayList<SelectItem>();

		selectedKurier = new ArrayList<String>();
		selectedOddzial = new ArrayList<String>();
		list = new ArrayList<StatisticsData>();
		listaKurierow = new ArrayList<SelectItem>();
		listaOdzialow = new ArrayList<SelectItem>();
		listaKurierow = dao.getCourierList();
		listaOdzialow= dao.getDepartmentsList();
		prepareLabels();
		//reloadData();
	}

	/**
	 * Metoda przygotowuje listy wyboru
	 */
	private void prepareLabels() {
		calendar.equals("");
		disabledOddzialy= true;
		disabledKurier=false;
		Calendar teraz = Calendar.getInstance();
		Calendar przed = Calendar.getInstance();
		przed.add(Calendar.DATE, -7);
		dataOd = calendar.StringToDate(calendar.CalendarToString(przed));
		dataDo = calendar.StringToDate(calendar.CalendarToString(teraz));

		selectedTypWykresu = "horizontalBar";
		selectedTyp = "1";
		typy.add(new SelectItem("1", "kurier- wszystkie paczki"));
		typy.add(new SelectItem("2", "kurier- paczki dostarczone"));
		typy.add(new SelectItem("3", "kurier- paczki niedostarczone"));
		typy.add(new SelectItem("4", "kurier- przebyte kilometry"));
		typy.add(new SelectItem("5", "oddziały - liczba paczek"));
		typy.add(new SelectItem("6", "zyski"));

		typWykresu.add(new SelectItem("verticalBar", "słupkowy"));
		typWykresu.add(new SelectItem("line", "liniowy"));
		typWykresu.add(new SelectItem("horizontalBar", "słupkowy horyzontalny"));
		typWykresu.add(new SelectItem("radarArea", "radar"));

		perspektywa = true;
	}

	/**
	 * @return zwraca obiekt tej klasy
	 */
	public ChartModel getValue() {
		return this;
	}

	/* (non-Javadoc)
	 * @see org.apache.myfaces.trinidad.model.ChartModel#getGroupLabels()
	 */
	public List<String> getGroupLabels() {

		labelX = calendar
				.generateDateList(dataOd.toString(), dataDo.toString());
		return labelX;
	}

	/* (non-Javadoc)
	 * @see org.apache.myfaces.trinidad.model.ChartModel#getSeriesLabels()
	 */
	public List<String> getSeriesLabels() {
		//reloadData();

 		List<String> products = new ArrayList<String>();
		String label = "";
		
		if(selectedTyp.equals("1") ||  selectedTyp.equals("2") ||  selectedTyp.equals("3") ||  selectedTyp.equals("4"))
		{
			for (int i = 0; i < selectedKurier.size(); i++) {
				for(int j = 0 ; j < listaKurierow.size() ; j ++)
					if(((Integer)listaKurierow.get(j).getValue()) ==Integer.parseInt(selectedKurier.get(i)))
					{
						label = (String)listaKurierow.get(j).getLabel();
						break;
					}
					products.add(label);
			}
		}else if(selectedTyp.equals("5")  )
		{

			for (int i = 0; i < selectedOddzial.size(); i++) {
				for(int j = 0 ; j < listaOdzialow.size() ; j ++)
					if(((Integer)listaOdzialow.get(j).getValue()) ==Integer.parseInt(selectedOddzial.get(i)))
					{
						label = (String)listaOdzialow.get(j).getLabel();
						break;
					}
					products.add(label);
			}
			
		}else if( selectedTyp.equals("6"))
		{
			label="zysk";
			products.add(label);
		}
		
		seriesNumber = products.size();
		return products;
	}

	/* (non-Javadoc)
	 * @see org.apache.myfaces.trinidad.model.ChartModel#getYValues()
	 */
	public List<List<Double>> getYValues() {

		
		
		List<List<Double>> chartValues = new ArrayList<List<Double>>();
		for( int i = 0 ; i < labelX.size() ; i ++)
		{
			List<Double> numbers = new ArrayList<Double>();
			chartValues.add(numbers);
			
		}
		
		for ( int j = 0 ; j < seriesNumber; j++ )
		{
			int l = 0;
			if(selectedTyp.equals("1") ||  selectedTyp.equals("2") ||  selectedTyp.equals("3") ||  selectedTyp.equals("4"))
			{
				reloadData(Integer.parseInt(selectedKurier.get(j)) ); // pobieramy dane dla odpowiedniego kuriera - id
				
			}else if(selectedTyp.equals("5"))
			{
				reloadData(Integer.parseInt(selectedOddzial.get(j)) ); // pobieramy dane dla odpowiedniego kuriera - id
				
			}else if(selectedTyp.equals("6"))
			{
				reloadData(0); // pobieramy dane dla odpowiedniego kuriera - id
				
			}
			
			for( int i = 0 ; i <labelX.size() ; i ++ )
			{
				if(l<list.size() && list.get(l)!=null && labelX.get(i).equals(list.get(l).getData().toString()) )
				{
				chartValues.get(i).add(new Double(list.get(l).getPositionY()));
				l++;
				}else
				{
				chartValues.get(i).add(new Double(0));
				}
			}
		}
		

		
		return chartValues;
	}



	/**
	 * Metoda wykonywana przy zmianie typu w oknie selekcji
	 */
	public void changeTyp() {
		if(selectedTyp.equals("1") || 
				selectedTyp.equals("2") || 
				selectedTyp.equals("3") || 
				selectedTyp.equals("4"))
		{
			disabledKurier=false;
			disabledOddzialy=true;
		}else if(selectedTyp.equals("5")  )
		{
			disabledKurier=true;
			disabledOddzialy=false;
		}else
		{
			disabledKurier=true;
			disabledOddzialy=true;
		}
		

	}

	/**
	 * Metoda pobiera z bazy danych , dane do tabeli.
	 */
	public void save() {
		
		for( int i = 0 ; i < typy.size() ; i++)
		{
			if(((String)(typy.get(i).getValue())).equals(selectedTyp))
			{
				tytul = typy.get(i).getLabel();
				break;
			}else
			{
				tytul="";
			}
			
		}
		
		
		dataList1= new ArrayList<StatisticsData>();
		if(selectedTyp.equals("1") ||  selectedTyp.equals("2") ||  selectedTyp.equals("3") ||  selectedTyp.equals("4"))
		{
			for ( int j = 0 ; j < selectedKurier.size() ; j ++ )
			{
				for ( int i = 0 ; i < listaKurierow.size() ; i ++)
				{
					if((Integer)listaKurierow.get(i).getValue() == Integer.parseInt(selectedKurier.get(j)))
					{
						int tmp = dataList1.size();
						Integer ktory = (Integer) listaKurierow.get(i).getValue();
						dataList1.addAll( dao.getData(dataOd , dataDo ,ktory , selectedTyp ));
						int tmp2= dataList1.size();
						
						for (int  a = tmp ; a < tmp2 ; a++)
						{
							dataList1.get(a).setLabel(listaKurierow.get(i).getLabel());
						}
						
						break;
					}
					
				}
			}
		}else if(selectedTyp.equals("5"))
		{
			
			for ( int j = 0 ; j < selectedOddzial.size() ; j ++ )
			{
				for ( int i = 0 ; i < listaOdzialow.size() ; i ++)
				{
					if((Integer)listaOdzialow.get(i).getValue() == Integer.parseInt(selectedOddzial.get(j)))
					{
						int tmp = dataList1.size();
						Integer ktory = (Integer) listaOdzialow.get(i).getValue();
						dataList1.addAll( dao.getData(dataOd , dataDo ,ktory , selectedTyp ));
						int tmp2= dataList1.size();
						
						for (int  a = tmp ; a < tmp2 ; a++)
						{
							dataList1.get(a).setLabel(listaOdzialow.get(i).getLabel());
						}
						
						break;
					}
					
				}
			
		
			}
		}else if(selectedTyp.equals("6"))
		{
			
						dataList1.addAll( dao.getData(dataOd , dataDo ,0 , selectedTyp ));
						for ( int i = 0  ; i < dataList1.size() ; i ++)
						{
							dataList1.get(i).setLabel("zysk");
						}
	}
	}

	/**
	 * Metoda pobiera z bazy danych dane do statystyk
	 * @param param parametr
	 */
	public void reloadData( Integer param ) {
		
			list=dao.getData(dataOd,dataDo,param,selectedTyp);
		
	}

	/**
	 * @return the calendar
	 */
	public CalendarManager getCalendar() {
		return calendar;
	}

	/**
	 * @param calendar
	 *            the calendar to set
	 */
	public void setCalendar(CalendarManager calendar) {
		this.calendar = calendar;
	}

	/**
	 * @return the selectedTyp
	 */
	public String getSelectedTyp() {
		return selectedTyp;
	}

	/**
	 * @param selectedTyp
	 *            the selectedTyp to set
	 */
	public void setSelectedTyp(String selectedTyp) {
		this.selectedTyp = selectedTyp;
	}

	/**
	 * @return the typy
	 */
	public ArrayList<SelectItem> getTypy() {
		return typy;
	}

	/**
	 * @param typy
	 *            the typy to set
	 */
	public void setTypy(ArrayList<SelectItem> typy) {
		this.typy = typy;
	}

	/**
	 * @return the list
	 */
	public ArrayList<StatisticsData> getList() {
		return list;
	}

	/**
	 * @param list
	 *            the list to set
	 */
	public void setList(ArrayList<StatisticsData> list) {
		this.list = list;
	}

	/**
	 * @return the dataOd
	 */
	public Date getDataOd() {
		return dataOd;
	}

	/**
	 * @param dataOd
	 *            the dataOd to set
	 */
	public void setDataOd(Date dataOd) {
		this.dataOd = dataOd;
	}

	/**
	 * @return the dataDo
	 */
	public Date getDataDo() {
		return dataDo;
	}

	/**
	 * @param dataDo
	 *            the dataDo to set
	 */
	public void setDataDo(Date dataDo) {
		this.dataDo = dataDo;
	}

	/**
	 * @return the type
	 */
	public Integer getType() {

		return type;
	}

	/**
	 * @param type
	 *            the type to set
	 */
	public void setType(Integer type) {
		this.type = type;
	}

	/**
	 * @return the labelX
	 */
	public List<String> getLabelX() {
		return labelX;
	}

	/**
	 * @param labelX
	 *            the labelX to set
	 */
	public void setLabelX(List<String> labelX) {
		this.labelX = labelX;
	}

	/**
	 * @return the seriesNumber
	 */
	public Integer getSeriesNumber() {
		return seriesNumber;
	}

	/**
	 * @param seriesNumber
	 *            the seriesNumber to set
	 */
	public void setSeriesNumber(Integer seriesNumber) {
		this.seriesNumber = seriesNumber;
	}

	/**
	 * @return the typWykresu
	 */
	public ArrayList<SelectItem> getTypWykresu() {
		return typWykresu;
	}

	/**
	 * @param typWykresu
	 *            the typWykresu to set
	 */
	public void setTypWykresu(ArrayList<SelectItem> typWykresu) {
		this.typWykresu = typWykresu;
	}

	/**
	 * @return the selectedTypWykresu
	 */
	public String getSelectedTypWykresu() {
		return selectedTypWykresu;
	}

	/**
	 * @param selectedTypWykresu
	 *            the selectedTypWykresu to set
	 */
	public void setSelectedTypWykresu(String selectedTypWykresu) {
		this.selectedTypWykresu = selectedTypWykresu;
	}

	/**
	 * @return the perspektywa
	 */
	public boolean isPerspektywa() {
		return perspektywa;
	}

	/**
	 * @param perspektywa
	 *            the perspektywa to set
	 */
	public void setPerspektywa(boolean perspektywa) {
		this.perspektywa = perspektywa;
	}

	/**
	 * @return the listaKurierow
	 */
	public ArrayList<SelectItem> getListaKurierow() {
		return listaKurierow;
	}

	/**
	 * @param listaKurierow
	 *            the listaKurierow to set
	 */
	public void setListaKurierow(ArrayList<SelectItem> listaKurierow) {
		this.listaKurierow = listaKurierow;
	}

	/**
	 * @return the selectedKurier
	 */
	public List<String> getSelectedKurier() {
		return selectedKurier;
	}

	/**
	 * @param selectedKurier
	 *            the selectedKurier to set
	 */
	public void setSelectedKurier(List<String> selectedKurier) {
		this.selectedKurier = selectedKurier;
	}

	/**
	 * @return the listaOdzialow
	 */
	public ArrayList<SelectItem> getListaOdzialow() {
		return listaOdzialow;
	}

	/**
	 * @param listaOdzialow the listaOdzialow to set
	 */
	public void setListaOdzialow(ArrayList<SelectItem> listaOdzialow) {
		this.listaOdzialow = listaOdzialow;
	}

	/**
	 * @return the selectedOddzial
	 */
	public List<String> getSelectedOddzial() {
		return selectedOddzial;
	}

	/**
	 * @param selectedOddzial the selectedOddzial to set
	 */
	public void setSelectedOddzial(List<String> selectedOddzial) {
		this.selectedOddzial = selectedOddzial;
	}

	/**
	 * @return the disabledKurier
	 */
	public boolean isDisabledKurier() {
		return disabledKurier;
	}

	/**
	 * @param disabledKurier the disabledKurier to set
	 */
	public void setDisabledKurier(boolean disabledKurier) {
		this.disabledKurier = disabledKurier;
	}

	/**
	 * @return the disabledOddzialy
	 */
	public boolean isDisabledOddzialy() {
		return disabledOddzialy;
	}

	/**
	 * @param disabledOddzialy the disabledOddzialy to set
	 */
	public void setDisabledOddzialy(boolean disabledOddzialy) {
		this.disabledOddzialy = disabledOddzialy;
	}



	/**
	 * @return the tytul
	 */
	public String getTytul() {
		return tytul;
	}

	/**
	 * @param tytul the tytul to set
	 */
	public void setTytul(String tytul) {
		this.tytul = tytul;
	}

	/**
	 * @return the dataList1
	 */
	public ArrayList<StatisticsData> getDataList1() {
		return dataList1;
	}

	/**
	 * @param dataList1 the dataList1 to set
	 */
	public void setDataList1(ArrayList<StatisticsData> dataList1) {
		this.dataList1 = dataList1;
	}

	
}
